#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>

static struct my_device {
    struct module *owner;
} *my_device;

static int __init my_module_init(void)
{
    // 分配设备结构体
    my_device = kzalloc(sizeof(struct my_device), GFP_KERNEL);
    if (!my_device) {
        return -ENOMEM;
    }

    // 增加当前模块的引用计数
    if (!try_module_get(THIS_MODULE)) {
        printk(KERN_ERR "Failed to get module reference.\n");
        kfree(my_device);
        return -EFAULT;
    }

    // 设置模块所有者
    my_device->owner = THIS_MODULE;

    printk(KERN_INFO "Module reference count increased.\n");
    return 0;
}

static void __exit my_module_exit(void)
{
    // 减少模块的引用计数
    module_put(my_device->owner);

    // 释放设备结构体
    kfree(my_device);

    printk(KERN_INFO "Module reference count decreased.\n");
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple module to demonstrate try_module_get.");


